//package com.woniuxy.microsysserver.serurity.aclimpl;
//
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.woniuxy.microsysserver.serurity.acl.entity.Permission;
//import com.woniuxy.microsysserver.serurity.acl.entity.RolePermission;
//import com.woniuxy.microsysserver.serurity.acl.entity.User;
//import com.woniuxy.microsysserver.serurity.acldao.PermissionMapper;
//import com.woniuxy.microsysserver.serurity.aclservice.PermissionService;
//import com.woniuxy.microsysserver.serurity.aclservice.RolePermissionService;
//import com.woniuxy.microsysserver.serurity.aclservice.UserService;
//import com.woniuxy.microsysserver.serurity.util.MemuHelper;
//import com.woniuxy.microsysserver.serurity.util.PermissionHelper;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Service;
//import org.springframework.util.StringUtils;
//
//import java.util.ArrayList;
//import java.util.HashSet;
//import java.util.List;
//
///*
// * @author: masterhai
// * @date: 2021/3/3:22:53
// * @description:权限 服务实现类
// */
//@Service
//public class PermissionServiceImpl extends ServiceImpl<PermissionMapper, Permission> implements PermissionService {
//
//    @Autowired(required = false)
//    private RolePermissionService rolePermissionService;
//
//    @Autowired(required = false)
//    private UserService userService;
//
//    //获取全部菜单
//    @Override
//    public List<Permission> queryAllMenu () {
//
//        QueryWrapper<Permission> wrapper = new QueryWrapper<>();
//        wrapper.orderByDesc("id");
//        List<Permission> permissionList = baseMapper.selectList(wrapper);
//
//        List<Permission> result = bulid(permissionList);
//
//        return result;
//    }
//
//    //根据角色获取菜单
//    @Override
//    public List<Permission> selectAllMenu (String roleId) {
//        List<Permission> allPermissionList = baseMapper.selectList(new QueryWrapper<Permission>().orderByAsc("CAST(id AS SIGNED)"));
//
//        //根据角色id获取角色权限
//        List<RolePermission> rolePermissionList = rolePermissionService.list(new QueryWrapper<RolePermission>().eq("role_id", roleId));
//        //转换给角色id与角色权限对应Map对象
////        List<String> permissionIdList = rolePermissionList.stream().map(e -> e.getPermissionId()).collect(Collectors.toList());
////        allPermissionList.forEach(permission -> {
////            if(permissionIdList.contains(permission.getId())) {
////                permission.setSelect(true);
////            } else {
////                permission.setSelect(false);
////            }
////        });
//        for (int i = 0; i < allPermissionList.size(); i++) {
//            Permission permission = allPermissionList.get(i);
//            for (int m = 0; m < rolePermissionList.size(); m++) {
//                RolePermission rolePermission = rolePermissionList.get(m);
//                if (rolePermission.getPermissionId().equals(permission.getId())) {
//                    permission.setSelect(true);
//                }
//            }
//        }
//
//
//        List<Permission> permissionList = bulid(allPermissionList);
//        return permissionList;
//    }
//
//    //给角色分配权限
//    @Override
//    public void saveRolePermissionRealtionShip (String roleId, String[] permissionIds) {
//
//        rolePermissionService.remove(new QueryWrapper<RolePermission>().eq("role_id", roleId));
//
//
//        List<RolePermission> rolePermissionList = new ArrayList<>();
//        for (String permissionId : permissionIds) {
//            if (StringUtils.isEmpty(permissionId)) {
//                continue;
//            }
//
//            RolePermission rolePermission = new RolePermission();
//            rolePermission.setRoleId(roleId);
//            rolePermission.setPermissionId(permissionId);
//            rolePermissionList.add(rolePermission);
//        }
//        rolePermissionService.saveBatch(rolePermissionList);
//    }
//
//    //递归删除菜单
//    @Override
//    public void removeChildById (String id) {
//        List<String> idList = new ArrayList<>();
//        this.selectChildListById(id, idList);
//
//        idList.add(id);
//        baseMapper.deleteBatchIds(idList);
//    }
//
//    //根据用户id获取用户菜单
//    @Override
//    public List<String> selectPermissionValueByUserId (String id) {
//
//        List<String> selectPermissionValueList = null;
//        if (this.isSysAdmin(id)) {
//            //如果是系统管理员，获取所有权限
//            selectPermissionValueList = baseMapper.selectAllPermissionValue();
//            System.out.println("===========================管理员权限==========================================" + selectPermissionValueList);
//
//        } else {
//            System.out.println("3.----------------开始获取普通员工权限,id:" + id);
//            selectPermissionValueList = baseMapper.selectPermissionValueByUserId(id);
//        }
//        return selectPermissionValueList;
//    }
//
//    @Override
//    public List<JSONObject> selectPermissionByUserId (String userId) {
//        List<Permission> selectPermissionList = null;
//        if (this.isSysAdmin(userId)) {
//            //如果是超级管理员，获取所有菜单
//            selectPermissionList = baseMapper.selectList(null);
//        } else {
//            selectPermissionList = baseMapper.selectPermissionByUserId(userId);
//        }
//        List<Permission> permissionList = PermissionHelper.bulid(selectPermissionList);
//        List<JSONObject> result = MemuHelper.bulid(permissionList);
//        return result;
//    }
//
//    /**
//     * 判断用户是否系统管理员
//     *
//     * @param userId
//     * @return
//     */
//    private boolean isSysAdmin (String userId) {
//        User user = userService.getById(userId);
//
//        if (null != user && "18113410471".equals(user.getUsername())) {
//            return true;
//        }
//        return false;
//    }
//
//    /**
//     * 递归获取子节点
//     *
//     * @param id
//     * @param idList
//     */
//    private void selectChildListById (String id, List<String> idList) {
//        List<Permission> childList = baseMapper.selectList(new QueryWrapper<Permission>().eq("pid", id).select("id"));
//        childList.stream().forEach(item -> {
//            idList.add(item.getId());
//            this.selectChildListById(item.getId(), idList);
//        });
//    }
//
//    /**
//     * 使用递归方法建菜单
//     *
//     * @param treeNodes
//     * @return
//     */
//    private static List<Permission> bulid (List<Permission> treeNodes) {
//        List<Permission> trees = new ArrayList<>();
//        for (Permission treeNode : treeNodes) {
//            if ("0".equals(treeNode.getPid())) {
//                treeNode.setLevel(1);
//                trees.add(findChildren(treeNode, treeNodes));
//            }
//        }
//        return trees;
//    }
//
//    /**
//     * 递归查找子节点
//     *
//     * @param treeNodes
//     * @return
//     */
//    private static Permission findChildren (Permission treeNode, List<Permission> treeNodes) {
//        treeNode.setChildren(new ArrayList<Permission>());
//
//        for (Permission it : treeNodes) {
//            if (treeNode.getId().equals(it.getPid())) {
//                int level = treeNode.getLevel() + 1;
//                it.setLevel(level);
//                if (treeNode.getChildren() == null) {
//                    treeNode.setChildren(new ArrayList<>());
//                }
//                treeNode.getChildren().add(findChildren(it, treeNodes));
//            }
//        }
//        return treeNode;
//    }
//
//
//    //========================递归查询所有菜单================================================
//    //获取全部菜单
//    @Override
//    public List<Permission> queryAllMenuGuli () {
//        //1 查询菜单表所有数据
//        QueryWrapper<Permission> wrapper = new QueryWrapper<>();
//        wrapper.orderByDesc("id");
//        List<Permission> permissionList = baseMapper.selectList(wrapper);
//        //2 把查询所有菜单list集合按照要求进行封装
//        List<Permission> resultList = bulidPermission(permissionList);
//        return resultList;
//    }
//
//    //把返回所有菜单list集合进行封装的方法
//    public static List<Permission> bulidPermission (List<Permission> permissionList) {
//
//        //创建list集合，用于数据最终封装
//        List<Permission> finalNode = new ArrayList<>();
//        //把所有菜单list集合遍历，得到顶层菜单 pid=0菜单，设置level是1
//        for (Permission permissionNode : permissionList) {
//            //得到顶层菜单 pid=0菜单
//            if ("0".equals(permissionNode.getPid())) {
//                //设置顶层菜单的level是1
//                permissionNode.setLevel(1);
//                //根据顶层菜单，向里面进行查询子菜单，封装到finalNode里面
//                finalNode.add(selectChildren(permissionNode, permissionList));
//            }
//        }
//        return finalNode;
//    }
//
//    private static Permission selectChildren (Permission permissionNode, List<Permission> permissionList) {
//        //1 因为向一层菜单里面放二层菜单，二层里面还要放三层，把对象初始化
//        permissionNode.setChildren(new ArrayList<Permission>());
//
//        //2 遍历所有菜单list集合，进行判断比较，比较id和pid值是否相同
//        for (Permission it : permissionList) {
//            //判断 id和pid值是否相同
//            if (permissionNode.getId().equals(it.getPid())) {
//                //把父菜单的level值+1
//                int level = permissionNode.getLevel() + 1;
//                it.setLevel(level);
//                //如果children为空，进行初始化操作
//                if (permissionNode.getChildren() == null) {
//                    permissionNode.setChildren(new ArrayList<Permission>());
//                }
//                //把查询出来的子菜单放到父菜单里面
//                permissionNode.getChildren().add(selectChildren(it, permissionList));
//            }
//        }
//        return permissionNode;
//    }
//
//    //============递归删除菜单==================================
//    @Override
//    public void removeChildByIdGuli (String id) {
//        //1 创建list集合，用于封装所有删除菜单id值
//        List<String> idList = new ArrayList<>();
//        //2 向idList集合设置删除菜单id
//        this.selectPermissionChildById(id, idList);
//        //把当前id封装到list里面
//        idList.add(id);
//        baseMapper.deleteBatchIds(idList);
//    }
//
//    //2 根据当前菜单id，查询菜单里面子菜单id，封装到list集合
//    private void selectPermissionChildById (String id, List<String> idList) {
//        //查询菜单里面子菜单id
//        QueryWrapper<Permission> wrapper = new QueryWrapper<>();
//        wrapper.eq("pid", id);
//        wrapper.select("id");
//        List<Permission> childIdList = baseMapper.selectList(wrapper);
//        //把childIdList里面菜单id值获取出来，封装idList里面，做递归查询
//        childIdList.stream().forEach(item -> {
//            //封装idList里面
//            idList.add(item.getId());
//            //递归查询
//            this.selectPermissionChildById(item.getId(), idList);
//        });
//    }
//
//    //=========================给角色分配菜单=======================
//    @Override
//    public void saveRolePermissionRealtionShipGuli (String roleId, String[] permissionIds) {
//        //roleId角色id
//        //permissionId菜单id 数组形式
////        SimpleDateFormat yyyyMMddHHMMSS = new SimpleDateFormat("yyyyMMddHHMMSS");
//        //3.根据权限id查询所有父级权限id
//       // long startTime = System.currentTimeMillis();
//        HashSet<String> ppIds = getAllpermissionIds(permissionIds);
////        long endTime = System.currentTimeMillis();
////        System.out.println("总共耗时:" + (endTime - startTime) + "毫秒");
//        //4.创建list集合封装所有对象
//        ArrayList<RolePermission> rolePermissionList = new ArrayList<>();
//        //遍历权限id
//        for (String ppId : ppIds) {
//            RolePermission rolePermission = new RolePermission();
//            rolePermission.setRoleId(roleId);
//            rolePermission.setPermissionId(ppId);
//            rolePermissionList.add(rolePermission);
//        }
//        //添加到角色菜单关系表
//        rolePermissionService.saveBatch(rolePermissionList);
//    }
//
//    //优化代码,查询所有关联id
////    private HashSet<String> getPermissionIdByMap (String[] permissionIds, HashSet<String> setList) {
////        QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
////        List<Permission> permissionList = baseMapper.selectList(queryWrapper);
////        SimpleDateFormat yyyyMMddHHMMSS = new SimpleDateFormat("yyyyMMddHHMMSS");
////        insertData(permissionList,yyyyMMddHHMMSS);
////        long startTime = System.currentTimeMillis();
////        HashMap<String, String> hashMap = new HashMap<>();
////        //组装数据成map
////        for (Permission permission : permissionList) {
////            hashMap.put(permission.getId(), permission.getPid());
////        }
////        //遍历传入的权限id数组
////        for (String id : permissionIds) {
////            //获取pid
////            String pid = hashMap.get(id);
////            if ("0".equals(pid)) {
////                //添加当前id进集合
////                setList.add(id);
////                break;
////            }
////            while (true) {
////                //添加pid进集合
////                setList.add(pid);
////                //以当前pid作为新一个id继续查询
////                pid = hashMap.get(pid);
////                if ("0".equals(0)) {
////                    break;
////                }
////            }
////        }
////        long endTime = System.currentTimeMillis();
////        return null;
////    }
//
//    //根据前端传入的权限id查询所有父级id
//    private HashSet<String> getAllpermissionIds (String[] permissionIds) {
//        HashSet<String> hashSet = new HashSet<>();
//        // 传入的权限id:1195268474480156674	传入的权限id:1195268474480156675
//        QueryWrapper<Permission> queryWrapper = new QueryWrapper<>();
//        List<Permission> permissionList = baseMapper.selectList(queryWrapper);
//        for (String permissionId : permissionIds) {
//            hashSet.add(permissionId);
//            findParentIds(permissionId, permissionList, hashSet);
//        }
//        return hashSet;
//    }
//
//    private void findParentIds (String id, List<Permission> permissionList, HashSet<String> setList) {
//        for (Permission permission : permissionList) {
//            //1.如果当前遍历的id与对象id相等,且pid=0,说明传入的此权限为根权限,直接返回
//            if (id.equals(permission.getId())) {
//                if (permission.getPid().equals("0")) {//1195268474480156673
//                    // setList.add(permission.getId());
//                    return;
//                } else {
//                    //此时id相等pid却不想等,说明匹配到的权限对象还存在上级菜单,首先将pid存入集合
//                    setList.add(permission.getPid());
//                    //递归调用自己
//                    findParentIds(permission.getPid(), permissionList, setList);
//                }
//            }
//        }
//
//    }
//}
